package com.tek.ding.faceding.utils;

import java.util.Optional;
import java.util.function.Supplier;

/**
 * 空指针处理类
 *
 * @author 567
 * @date 2020-04-08  16:36
 */
public class NepUtil {


    /**
     * 如果Double为 null  返回 0
     *
     * @param obj obj
     * @return obj
     */
    public static Double nullToZero(Double obj) {
        obj = Optional.ofNullable(obj).orElse(0d);
        return obj;
    }

    /**
     * 如果Double为 null  返回 0
     *
     * @param obj obj
     * @return obj
     */
    public static Long nullToZero(Long obj) {
        obj = Optional.ofNullable(obj).orElse(0L);
        return obj;
    }

    /**
     * 如果Integer为 null  返回 0
     *
     * @param obj obj
     * @return obj
     */
    public static Integer nullToZero(Integer obj) {
        obj = Optional.ofNullable(obj).orElse(0);
        return obj;
    }

    /**
     * 如果String为 null  返回 空字符串
     *
     * @param obj obj
     * @return obj
     */
    public static String nullToSpace(String obj) {
        obj = Optional.ofNullable(obj).orElse("");
        return obj;
    }

    /**
     * 忽略NullPointerException的获取,如果有空指针，返回null
     *
     * @param supplier supplier
     * @param <T>      <T>
     * @return Optional
     */
    public static <T> Optional<T> nullCheck(Supplier<T> supplier) {
        try {
            T result = supplier.get();
            return Optional.ofNullable(result);
        } catch (NullPointerException e) {
            // 可能会抛出空指针异常，直接返回一个空的 Optional 对象
            return Optional.empty();
        }
    }

    /**
     * 忽略NullPointerException的获取,如果有空指针，返回null
     *
     * @param supplier supplier
     * @param <T>      <T>
     * @return 如果有空指针，返回null
     */
    public static <T> T orNull(Supplier<T> supplier) {
        try {
            return supplier.get();
        } catch (NullPointerException e) {
            return null;
        }
    }

    /**
     * 忽略NullPointerException的获取，如果supplier有空指针，返回or
     *
     * @param supplier supplier
     * @param or       or
     * @param <T>      <T>
     * @return 如果supplier有空指针，返回or
     */
    public static <T> T or(Supplier<T> supplier, T or) {
        try {
            T t = supplier.get();
            if (t != null) {
                return t;
            }
            return or;
        } catch (NullPointerException e) {
            return or;
        }
    }

}
